<?
class FRM_Tools_Xml
{
	/**
	 * Переконвертация с SimpleXMLElement в array
	 *
	 * @param SimpleXMLElement $xml
	 * @return array
	 */
	static function simpleXMLToArray($xml)
	{
		if ($xml instanceof SimpleXMLElement) {
			$children = $xml->children();
			$return = null;
		}
        foreach ($children as $element => $value) {
            if ($value instanceof SimpleXMLElement) {
                $values = (array)$value->children();

                if (count($values) > 0) {
                    if (isset($return[$element]) && is_array($return[$element])) {
                        //hook
                        foreach ($return[$element] as $k=>$v) {
                            if (!is_int($k)) {
                                $return[$element][0][$k] = $v;
                                unset($return[$element][$k]);
                            }
                        }
                        $return[$element][] = self::simpleXMLToArray($value);
                    } else {
                        $return[$element] = self::simpleXMLToArray($value);
                    }
                } else {
                    if (!isset($return[$element])) {
                    	if ($value == "true") {
                    		$return[$element] = true;
                    	}
                    	elseif ($value == "false") {
                    		$return[$element] = false;
                    	}
                    	elseif (intval($value)) {
                    		$return[$element] = intval($value);
                    	}
                    	else {
                        	$return[$element] = (string)$value;
                    	}
                    } else {
                        if (!is_array($return[$element])) {                        	
                            $return[$element] = array($return[$element], (string)$value);
                        } else {
                            $return[$element][] = (string)$value;
                        }
                    }
                }
            }
        }
		
		if (is_array($return)) {
			return $return;
		} else {
			return false;
		}
	}
	
	/**
	 * Переконвертация с xml в array
	 *
	 * @param string $xml
	 * @return array
	 */
	static function XMLToArray($xml)
	{
		return self::simpleXMLToArray(simplexml_load_string($xml));
	}
	
	/**
	 * Переконвертация с array в SimpleXMLElement
	 *
	 * @param array $array
	 * @param string $name
	 * @param SimpleXMLElement $xml
	 * @return SimpleXMLElement
	 */
	
	static function arrayToSimpleXML($array, $name="setting" ,&$xml=null)
	{
		if(is_null($xml))
		{
			$xml = new SimpleXMLElement("<{$name}/>");
		}

		foreach($array as $key => $value)
		{
			if(is_array($value))
			{
				$xml->addChild($key);
				self::arrayToSimpleXML($value, $name, $xml->$key);
			}
			else {
				$xml->addChild($key, $value);				
			}
		}
		return $xml;
	}
	
	/**
	  * Переконвертация с array в xml
	 *
	 * @param array $array
	 * @param string $name
	 * @param SimpleXMLElement $xml
	 * @return string
	 */
	static function arrayToXML($array, $name="setting" ,&$xml=null)
	{
		return self::arrayToSimpleXML($array, $name ,$xml)->asXML();
	}

}?>